#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 5 || strcmp(argv[1], "-t") != 0) {
        fprintf(stderr, "格式: %s -t [1|2|3] <命令> <输出文件>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    int type = atoi(argv[2]); // 解析类型参数

    /* 创建子进程 */
    pid_t pid = fork();
    if (pid == 0) {  // 子进程上下文
        int fd = open(argv[4], O_WRONLY | O_CREAT | O_TRUNC, 0644);
        
        /* 重定向选择器 */
        switch (type) { // 修复单引号错误
            case 1:  // 经典关闭重建法
                close(STDOUT_FILENO);
                open(argv[4], O_WRONLY | O_CREAT | O_TRUNC, 0644);
                break;
            case 2:  // 描述符复制法
                dup(fd);       // 复制到最小可用描述符
                close(fd);
                break;
            case 3:  // 原子操作法
                dup2(fd, STDOUT_FILENO);
                close(fd);
                break;
        }

        // 执行命令（此处需要添加命令执行逻辑，例如使用execvp）
        execlp(argv[3], argv[3], NULL);
        perror("execlp"); // 如果exec失败
        exit(EXIT_FAILURE);
    } else if (pid > 0) { // 父进程等待子进程
        wait(NULL);
    } else {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    return 0;
}
